//package com.pine.dcts.service;
//
//import com.pine.dcts.common.DctsException;
//
//import java.util.ArrayList;
//import java.util.Iterator;
//import java.util.Objects;
//
///**
// * @author xiaoyuan
// * @create 2021/1/15 17:52
// **/
//public class FutureImpl<T> implements Future<T> {
//    private boolean failed;
//    private boolean succeeded;
//    private Handler<AsyncResult<T>> handler;
//    private T result;
//    private Throwable throwable;
//
//    public synchronized T result() {
//        return this.result;
//    }
//
//    public synchronized Throwable cause() {
//        return this.throwable;
//    }
//
//    public synchronized boolean succeeded() {
//        return this.succeeded;
//    }
//
//    public synchronized boolean failed() {
//        return this.failed;
//    }
//
//    public synchronized boolean isComplete() {
//        return this.failed || this.succeeded;
//    }
//
//    public Future<T> onComplete(Handler<AsyncResult<T>> handler) {
//        Objects.requireNonNull(handler, "No null handler accepted");
//        synchronized (this) {
//            if (!this.isComplete()) {
//                if (this.handler == null) {
//                    this.handler = handler;
//                } else {
//                    this.addHandler(handler);
//                }
//
//                return this;
//            }
//        }
//
//        this.dispatch(handler);
//        return this;
//    }
//
//    private void addHandler(Handler<AsyncResult<T>> h) {
//        FutureImpl.Handlers handlers;
//        if (this.handler instanceof FutureImpl.Handlers) {
//            handlers = (FutureImpl.Handlers) this.handler;
//        } else {
//            handlers = new FutureImpl.Handlers();
//            handlers.add(this.handler);
//            this.handler = handlers;
//        }
//
//        handlers.add(h);
//    }
//
//    protected void dispatch(Handler<AsyncResult<T>> handler) {
//        if (handler instanceof FutureImpl.Handlers) {
//            Iterator var2 = ((FutureImpl.Handlers) handler).iterator();
//
//            while (var2.hasNext()) {
//                Handler<AsyncResult<T>> h = (Handler) var2.next();
//                h.handle(this);
//            }
//        } else {
//            handler.handle(this);
//        }
//
//    }
//
//    public void complete(T result) {
//        if (!this.tryComplete(result)) {
//            throw new IllegalStateException("Result is already complete: " + (this.succeeded ? "succeeded" : "failed"));
//        }
//    }
//
//    public void complete() {
//        if (!this.tryComplete()) {
//            throw new IllegalStateException("Result is already complete: " + (this.succeeded ? "succeeded" : "failed"));
//        }
//    }
//
//    public void fail(Throwable cause) {
//        if (!this.tryFail(cause)) {
//            throw new IllegalStateException("Result is already complete: " + (this.succeeded ? "succeeded" : "failed"));
//        }
//    }
//
//    public void fail(String failureMessage) {
//        if (!this.tryFail(failureMessage)) {
//            throw new IllegalStateException("Result is already complete: " + (this.succeeded ? "succeeded" : "failed"));
//        }
//    }
//
//    public boolean tryComplete(T result) {
//        Handler h;
//        synchronized (this) {
//            if (this.succeeded || this.failed) {
//                return false;
//            }
//
//            this.result = result;
//            this.succeeded = true;
//            h = this.handler;
//            this.handler = null;
//        }
//
//        if (h != null) {
//            this.dispatch(h);
//        }
//
//        return true;
//    }
//
//    public boolean tryComplete() {
//        return this.tryComplete((T) null);
//    }
//
//    public void handle(Future<T> ar) {
//        if (ar.succeeded()) {
//            this.complete(ar.result());
//        } else {
//            this.fail(ar.cause());
//        }
//
//    }
//
//    public Handler<AsyncResult<T>> completer() {
//        return this;
//    }
//
//    public void handle(AsyncResult<T> asyncResult) {
//        if (asyncResult.succeeded()) {
//            this.complete(asyncResult.result());
//        } else {
//            this.fail(asyncResult.cause());
//        }
//
//    }
//
//    public boolean tryFail(Throwable cause) {
//        Handler h;
//        synchronized (this) {
//            if (this.succeeded || this.failed) {
//                return false;
//            }
//
//            this.throwable = (Throwable) (cause != null ? cause : new DctsException((String) null));
//            this.failed = true;
//            h = this.handler;
//            this.handler = null;
//        }
//
//        if (h != null) {
//            h.handle(this);
//        }
//
//        return true;
//    }
//
//    public boolean tryFail(String failureMessage) {
//        return this.tryFail((Throwable) (new DctsException(failureMessage)));
//    }
//
//    public Future<T> future() {
//        return this;
//    }
//
//    public String toString() {
//        synchronized (this) {
//            if (this.succeeded) {
//                return "Future{result=" + this.result + "}";
//            } else {
//                return this.failed ? "Future{cause=" + this.throwable.getMessage() + "}" : "Future{unresolved}";
//            }
//        }
//    }
//
//    private class Handlers<T> extends ArrayList<Handler<AsyncResult<T>>> implements Handler<AsyncResult<T>> {
//        private Handlers() {
//        }
//
//        public void handle(AsyncResult<T> res) {
//            Iterator var2 = this.iterator();
//
//            while (var2.hasNext()) {
//                Handler<AsyncResult<T>> handler = (Handler) var2.next();
//                handler.handle(res);
//            }
//
//        }
//    }
//}
